package ru.kreda.webapp.client.logic;

import ru.kreda.webapp.client.BusyAsyncCallback;
import ru.kreda.webapp.client.Utils;
import ru.kreda.webapp.client.invocation.LoggedUserRequestAction;
import ru.kreda.webapp.client.invocation.LoggedUserRequestResult;
import ru.kreda.webapp.client.menu.MenuItem;
import ru.kreda.webapp.client.menu.RootMenu;
import ru.kreda.webapp.client.view.AppLayout;
import ru.kreda.webapp.client.view.IHeaderDisplay;
import ru.kreda.webapp.shared.AppException;

import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.layout.RowData;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.Anchor;

/**
 * Контроллер приложения (обработка сообщений главного окна).
 */
public class AppController {

	/**
	 * Конструктор
	 * 
	 * @param eventBus
	 *            шина сообщений
	 * @param placeController
	 *            контроллер place-ов
	 * @param appLayoutView
	 *            UI главной формы
	 */
	public AppController(final EventBus eventBus, final PlaceController placeController,
			final AppLayout appLayoutView) {
		final IHeaderDisplay headerDisplay = appLayoutView.getHeaderDisplay();
		// заполнение меню
		for (final MenuItem menuItem : RootMenu.getMenuItems()) {
			Anchor anchor = new Anchor(true);
			anchor.setText(menuItem.toString());
			anchor.setStyleName("menuLink");
			if (menuItem.getPlace() != null) {
				anchor.addClickHandler(new ClickHandler() {
					
					@Override
					public void onClick(ClickEvent event) {
						placeController.goTo(menuItem.getPlace());
					}
					
				});
			}
			appLayoutView.getMenuPanel().add(anchor, new RowData(-1, -1, new Margins(0, 10, 0, 20)));
		}
		appLayoutView.getMenuPanel().layout(true);
		// шапка
		appLayoutView.getHeaderDisplay().getLogoutLink().addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				throw new AppException("not authenticated");
			}
		});
		Utils.getDispatcher().execute(new LoggedUserRequestAction(), new BusyAsyncCallback<LoggedUserRequestResult>("logged user retrieval") {

			@Override
			protected void handleResult(LoggedUserRequestResult result) {
				headerDisplay.setUserInfo(result.getUserInfo());
			}
			
		});
	}

}
